package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.entrega1;

import junit.framework.Assert;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.uqbar.commons.utils.ApplicationContext;
import org.uqbar.commons.utils.MemoryStorage;
import org.uqbar.commons.utils.Storage;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.exceptions.PatenteNoReconocidaException;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.externos.ReconocedorDePatentes;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCapturas;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.ReconocedorDePatentesMock;

public class Punto4TestCase {

	public AdministradorCapturas adminCapturas;
	public Captura unaCaptura;

	@Before
	public void setUp() {

		Zona zona = new Zona("Zona Roja", "1552478536");
		Image foto = new Image();
		TipoInfraccion unaInfraccion = new TipoInfraccion("Cruzar en Rojo", 50,	100);
		unaCaptura = new Captura(zona, unaInfraccion, foto, new DateTime());
		ApplicationContext.getInstance().configureSingleton(Storage.class, new MemoryStorage());
		ApplicationContext.getInstance().configureHome(Captura.class);
		ApplicationContext.getInstance().configureSingleton(AdministradorCapturas.class, new AdministradorCapturas());
		adminCapturas = ApplicationContext.getInstance().getSingleton(AdministradorCapturas.class);
	}

	@Test
	public void verificarListaDePendientes() throws PatenteNoReconocidaException {
		
		/*
		 * Ingresar una infracci�n de forma que su foto no puede ser identificada por el 
		 * sistema externo reconocedor de patentes y verificar que fue agregada a la 
		 * lista de pendientes.
		 */
		
		ReconocedorDePatentes reconocedor = new ReconocedorDePatentesMock();
		Assert.assertTrue(adminCapturas.getCapturasPendientes().isEmpty());
		

		try {
			
			//Como una forma de implementaci�n del mock, en la segunda tira una una excepci�n
			//y por eso es que lo llamamos 2 veces para "que no pueda reconocer la patente".
			adminCapturas.reconocerPatente(unaCaptura, reconocedor);
			adminCapturas.reconocerPatente(unaCaptura, reconocedor);
		} catch (PatenteNoReconocidaException ex) {
			System.out.println(ex.getMessage());
		}

		Assert.assertFalse(adminCapturas.getCapturasPendientes().isEmpty());
	}
}
